17. 解决方案: LEFT 和 RIGHT JOIN

# LEFT JOIN 和 RIGHT JOIN 解决方案

这一部分讲解的是上一部分的最后两个问题,首先再看看我们处理的这两个表格:

INNER JOIN 问题

这些问题旨在让你对 LEFT JOIN INNER JOIN 的原理有所了解,然后才能使用它们处理更复杂的问题。

对于如下所示的 INNER JOIN

SELECT c.countryid, c.countryName, s.stateName
FROM Country c
JOIN State s
ON c.countryid = s.countryid;

我们实际上是将两个表格中匹配的主键和外键行连接到一起,如下图所示。

生成的表格将如下所示:

countryid countryName stateName
1 India Maharashtra
1 India Punjab
2 Nepal Kathmandu
3 United States California
3 United States Texas
4 Canada Alberta

LEFT JOIN 问题

这些问题旨在让你对 LEFT JOIN INNER JOIN 的原理有所了解,然后才能使用它们处理更复杂的问题。

对于如下所示的 LEFT JOIN

SELECT c.countryid, c.countryName, s.stateName
FROM Country c
LEFT JOIN State s
ON c.countryid = s.countryid;

和之前一样,我们实际上是将两个表格中匹配的主键和外键行连接到一起,但是我们还从 Country 表格中获取额外的行,即使它们在 State 表格中没有匹配的项。因此,我们获取的是 INNER JOIN 生成的所有行,同时还获取 FROM 中的表格里的其他行。

生成的表格将如下所示:

countryid countryName stateName
1 India Maharashtra
1 India Punjab
2 Nepal Kathmandu
3 United States California
3 United States Texas
4 Canada Alberta
5 Sri Lanka NULL
6 Brazil NULL

最后的 LEFT JOIN 注意事项

如果我们翻转表格顺序的话,实际上和 JOIN 语句获得的结果完全一样:

SELECT c.countryid, c.countryName, s.stateName
FROM State s
LEFT JOIN Country c
ON c.countryid = s.countryid;

这是因为如果 State 位于 左侧 表格中,则所有行再次出现在 右侧 表格中。

生成的表格将如下所示:

countryid countryName stateName
1 India Maharashtra
1 India Punjab
2 Nepal Kathmandu
3 United States California
3 United States Texas
4 Canada Alberta